{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "executionInfo": {
     "elapsed": 350,
     "status": "ok",
     "timestamp": 1649955640910,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "BANe9WM-_Ew0"
   },
   "outputs": [],
   "source": [
    "import gym\n",
    "import torch\n",
    "import torch.nn.functional as F\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import rl_utils"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "executionInfo": {
     "elapsed": 2,
     "status": "ok",
     "timestamp": 1649955643798,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "n1peNzvo_Ew1"
   },
   "outputs": [],
   "source": [
    "class PolicyNet(torch.nn.Module):\n",
    "    def __init__(self, state_dim, hidden_dim, action_dim):\n",
    "        super(PolicyNet, self).__init__()\n",
    "        self.fc1 = torch.nn.Linear(state_dim, hidden_dim)\n",
    "        self.fc2 = torch.nn.Linear(hidden_dim, action_dim)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.fc1(x))\n",
    "        return F.softmax(self.fc2(x), dim=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "executionInfo": {
     "elapsed": 2,
     "status": "ok",
     "timestamp": 1649955645289,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "KvWZvDoO_Ew1"
   },
   "outputs": [],
   "source": [
    "class ValueNet(torch.nn.Module):\n",
    "    def __init__(self, state_dim, hidden_dim):\n",
    "        super(ValueNet, self).__init__()\n",
    "        self.fc1 = torch.nn.Linear(state_dim, hidden_dim)\n",
    "        self.fc2 = torch.nn.Linear(hidden_dim, 1)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.fc1(x))\n",
    "        return self.fc2(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "executionInfo": {
     "elapsed": 516,
     "status": "ok",
     "timestamp": 1649955673254,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "FBnRPG_n_Ew2"
   },
   "outputs": [],
   "source": [
    "class ActorCritic:\n",
    "    def __init__(self, state_dim, hidden_dim, action_dim, actor_lr, critic_lr,\n",
    "                 gamma, device):\n",
    "        # 策略网络\n",
    "        self.actor = PolicyNet(state_dim, hidden_dim, action_dim).to(device)\n",
    "        self.critic = ValueNet(state_dim, hidden_dim).to(device)  # 价值网络\n",
    "        # 策略网络优化器\n",
    "        self.actor_optimizer = torch.optim.Adam(self.actor.parameters(),\n",
    "                                                lr=actor_lr)\n",
    "        self.critic_optimizer = torch.optim.Adam(self.critic.parameters(),\n",
    "                                                 lr=critic_lr)  # 价值网络优化器\n",
    "        self.gamma = gamma\n",
    "        self.device = device\n",
    "\n",
    "    def take_action(self, state):\n",
    "        state = torch.tensor([state], dtype=torch.float).to(self.device)\n",
    "        probs = self.actor(state)\n",
    "        action_dist = torch.distributions.Categorical(probs)\n",
    "        action = action_dist.sample()\n",
    "        return action.item()\n",
    "\n",
    "    def update(self, transition_dict):\n",
    "        states = torch.tensor(transition_dict['states'],\n",
    "                              dtype=torch.float).to(self.device)\n",
    "        actions = torch.tensor(transition_dict['actions']).view(-1, 1).to(\n",
    "            self.device)\n",
    "        rewards = torch.tensor(transition_dict['rewards'],\n",
    "                               dtype=torch.float).view(-1, 1).to(self.device)\n",
    "        next_states = torch.tensor(transition_dict['next_states'],\n",
    "                                   dtype=torch.float).to(self.device)\n",
    "        dones = torch.tensor(transition_dict['dones'],\n",
    "                             dtype=torch.float).view(-1, 1).to(self.device)\n",
    "\n",
    "        # 时序差分目标\n",
    "        td_target = rewards + self.gamma * self.critic(next_states) * (1 -\n",
    "                                                                       dones)\n",
    "        td_delta = td_target - self.critic(states)  # 时序差分误差\n",
    "        log_probs = torch.log(self.actor(states).gather(1, actions))\n",
    "        actor_loss = torch.mean(-log_probs * td_delta.detach())\n",
    "        # 均方误差损失函数\n",
    "        critic_loss = torch.mean(\n",
    "            F.mse_loss(self.critic(states), td_target.detach()))\n",
    "        self.actor_optimizer.zero_grad()\n",
    "        self.critic_optimizer.zero_grad()\n",
    "        actor_loss.backward()  # 计算策略网络的梯度\n",
    "        critic_loss.backward()  # 计算价值网络的梯度\n",
    "        self.actor_optimizer.step()  # 更新策略网络的参数\n",
    "        self.critic_optimizer.step()  # 更新价值网络的参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 52404,
     "status": "ok",
     "timestamp": 1649955727483,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "bJ5VTKxU_Ew3",
    "outputId": "c70fd2c1-dcc9-4a11-884e-ff463fdb1069"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Iteration 0:   0%|          | 0/100 [00:00<?, ?it/s]/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:15: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at  ../torch/csrc/utils/tensor_new.cpp:201.)\n",
      "  from ipykernel import kernelapp as app\n",
      "Iteration 0: 100%|██████████| 100/100 [00:00<00:00, 101.75it/s, episode=100, return=21.100]\n",
      "Iteration 1: 100%|██████████| 100/100 [00:01<00:00, 58.71it/s, episode=200, return=72.800]\n",
      "Iteration 2: 100%|██████████| 100/100 [00:05<00:00, 19.73it/s, episode=300, return=109.300]\n",
      "Iteration 3: 100%|██████████| 100/100 [00:05<00:00, 17.30it/s, episode=400, return=163.000]\n",
      "Iteration 4: 100%|██████████| 100/100 [00:06<00:00, 16.27it/s, episode=500, return=193.600]\n",
      "Iteration 5: 100%|██████████| 100/100 [00:06<00:00, 15.90it/s, episode=600, return=195.900]\n",
      "Iteration 6: 100%|██████████| 100/100 [00:06<00:00, 15.80it/s, episode=700, return=199.100]\n",
      "Iteration 7: 100%|██████████| 100/100 [00:06<00:00, 15.72it/s, episode=800, return=186.900]\n",
      "Iteration 8: 100%|██████████| 100/100 [00:06<00:00, 15.94it/s, episode=900, return=200.000]\n",
      "Iteration 9: 100%|██████████| 100/100 [00:06<00:00, 15.45it/s, episode=1000, return=200.000]\n"
     ]
    }
   ],
   "source": [
    "actor_lr = 1e-3\n",
    "critic_lr = 1e-2\n",
    "num_episodes = 1000\n",
    "hidden_dim = 128\n",
    "gamma = 0.98\n",
    "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\n",
    "    \"cpu\")\n",
    "\n",
    "env_name = 'CartPole-v0'\n",
    "env = gym.make(env_name)\n",
    "env.seed(0)\n",
    "torch.manual_seed(0)\n",
    "state_dim = env.observation_space.shape[0]\n",
    "action_dim = env.action_space.n\n",
    "agent = ActorCritic(state_dim, hidden_dim, action_dim, actor_lr, critic_lr,\n",
    "                    gamma, device)\n",
    "\n",
    "return_list = rl_utils.train_on_policy_agent(env, agent, num_episodes)\n",
    "\n",
    "# Iteration 0: 100%|██████████| 100/100 [00:00<00:00, 184.32it/s, episode=100,\n",
    "# return=21.100]\n",
    "# Iteration 1: 100%|██████████| 100/100 [00:01<00:00, 98.31it/s, episode=200,\n",
    "# return=72.800]\n",
    "# Iteration 2: 100%|██████████| 100/100 [00:01<00:00, 58.72it/s, episode=300,\n",
    "# return=109.300]\n",
    "# Iteration 3: 100%|██████████| 100/100 [00:04<00:00, 23.14it/s, episode=400,\n",
    "# return=163.000]\n",
    "# Iteration 4: 100%|██████████| 100/100 [00:08<00:00, 11.78it/s, episode=500,\n",
    "# return=193.600]\n",
    "# Iteration 5: 100%|██████████| 100/100 [00:08<00:00, 11.23it/s, episode=600,\n",
    "# return=195.900]\n",
    "# Iteration 6: 100%|██████████| 100/100 [00:08<00:00, 11.55it/s, episode=700,\n",
    "# return=199.100]\n",
    "# Iteration 7: 100%|██████████| 100/100 [00:09<00:00, 10.75it/s, episode=800,\n",
    "# return=186.900]\n",
    "# Iteration 8: 100%|██████████| 100/100 [00:08<00:00, 11.73it/s, episode=900,\n",
    "# return=200.000]\n",
    "# Iteration 9: 100%|██████████| 100/100 [00:08<00:00, 12.05it/s, episode=1000,\n",
    "# return=200.000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 573
    },
    "executionInfo": {
     "elapsed": 6,
     "status": "ok",
     "timestamp": 1649955727484,
     "user": {
      "displayName": "Sam Lu",
      "userId": "15789059763790170725"
     },
     "user_tz": -480
    },
    "id": "3mXhNUJU_Ew4",
    "outputId": "f2a53ebf-58ec-499c-c740-36ed419941c8"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "episodes_list = list(range(len(return_list)))\n",
    "plt.plot(episodes_list, return_list)\n",
    "plt.xlabel('Episodes')\n",
    "plt.ylabel('Returns')\n",
    "plt.title('Actor-Critic on {}'.format(env_name))\n",
    "plt.show()\n",
    "\n",
    "mv_return = rl_utils.moving_average(return_list, 9)\n",
    "plt.plot(episodes_list, mv_return)\n",
    "plt.xlabel('Episodes')\n",
    "plt.ylabel('Returns')\n",
    "plt.title('Actor-Critic on {}'.format(env_name))\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "第10章-Actor-Critic算法.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
